package DAO;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import Model.Filme;

import utils.ConnectionFactory;

public class DAOFilme {
	
	/* Atributo de conex�o que ser� utilizado nas opera��es */
	private Connection conexao;
	
	public DAOFilme() throws Exception{
		try{
			this.conexao = ConnectionFactory.getConnection();			
		}catch(Exception e){
			System.out.println(e.getLocalizedMessage());
		}
	}
	
	public boolean salvarFilme(Filme filme){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        ResultSet rs = null;
        String campos,valores;
        int contadorCampos = 0;
        campos = "";
        valores = "";
        
        
        if (filme == null){
            return false;
        }
        
        try{
            String SQL = "Insert into Filme ( ";
            if (filme.getNomeDiretor() != null) {
            	campos = campos + "nomeDiretor,";
            	valores = valores + "?,";
            }	
            if (filme.getSinopse() != null) {
            	campos = campos + "sinopse,";
            	valores = valores + "?,";
            }	
            if (filme.getIdadeMinima() != 0) {
            	campos = campos + "idadeMinima,";
            	valores = valores + "?,";
            }	
            if (filme.getCaminhoImagem() != null) {
            	campos = campos + "caminhoImagem,";
            	valores = valores + "?,";
            }	
            
            campos = campos + "nomeFilme,nomeFilmeOriginal,duracao,dataEstreia ) values ( ";
            valores = valores + "?,?,?,? )";
            SQL = SQL + campos + valores;
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            if (filme.getNomeDiretor() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getNomeDiretor());
            }	
            if (filme.getSinopse() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getSinopse());
            }	
            if (filme.getIdadeMinima() != 0) {
            	contadorCampos++;
            	ps.setInt(contadorCampos, filme.getIdadeMinima());
            }	
            if (filme.getCaminhoImagem() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getCaminhoImagem());
            }	
            
            ps.setString(contadorCampos+1,filme.getNomeFilme());
            ps.setString(contadorCampos+2,filme.getNomeFilmeOriginal());
            ps.setInt(contadorCampos+3,filme.getDuracao());
            ps.setDate(contadorCampos+4, filme.getDataEstreia());
            ps.executeUpdate();
            return true;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return false;
        }

	}
	
	public ArrayList<Filme> listarTodosFilme(int paginaAtual){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        ResultSet rs = null;    
        ArrayList<Filme> filmes = new ArrayList<Filme>();
        try{
        	int offSet = (paginaAtual - 1) * 10;
            String SQL = " SELECT * FROM filme ";
            if (paginaAtual > 0) {
                SQL = SQL + " LIMIT 10 OFFSET ? ";
            }
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            if (paginaAtual > 0) {
                if (offSet > 0)
                    ps.setInt(1, offSet);
                else
                    ps.setInt(1, 0);
            }
            rs = ps.executeQuery();
            while (rs.next()){
            	filmes.add(new Filme(rs.getString("nomeFilme"),rs.getString("nomeFilmeOriginal"),rs.getString("nomeDiretor"),rs.getInt("duracao"),rs.getString("sinopse"),rs.getInt("idadeMinima"),rs.getString("caminhoImagem"),rs.getDate("dataEstreia"),rs.getInt("codigo")));
            }
            return filmes;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return null;
        }

	}

	public ArrayList<Filme> listarFiltroFilme(String nome,int idade,int paginaAtual){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        ResultSet rs = null;    
        int contCampos = 1;
        ArrayList<Filme> filmes = new ArrayList<Filme>();
        try{
        	int offSet = (paginaAtual - 1) * 10;
            String SQL = " SELECT * FROM filme where 1=1 ";
           
            SQL = SQL + "  ";           
            connL = this.conexao;
            if ((nome != null) && (nome != "")) {
            	SQL = SQL + " and nomeFilme like ? ";
            	contCampos++;
            }
            if (idade > 0){
            	SQL = SQL + " and idadeMinima = ? ";
            }
            if (paginaAtual > 0) {
                SQL = SQL + " LIMIT 10 OFFSET ? ";
            }ps = connL.prepareStatement(SQL);
            if (paginaAtual > 0) {
                if (offSet > 0)
                    ps.setInt(1, offSet);
                else
                    ps.setInt(1, 0);
            }
            if ((nome != null) && (nome != "")) 
            	ps.setString(1, "%" + nome + "%");
            if (idade > 0){
            	ps.setInt(contCampos,idade);
            	contCampos++;
            }
            if (offSet > 0)
                ps.setInt(contCampos ,offSet);
             else
                 ps.setInt(contCampos,0);
            rs = ps.executeQuery();
            while (rs.next()){
            	filmes.add(new Filme(rs.getString("nomeFilme"),rs.getString("nomeFilmeOriginal"),rs.getString("nomeDiretor"),rs.getInt("duracao"),rs.getString("sinopse"),rs.getInt("idadeMinima"),rs.getString("caminhoImagem"),rs.getDate("dataEstreia"),rs.getInt("codigo")));
            }
            return filmes;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return null;
        }

	}

	public Filme buscarFilme(int codigo){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        ResultSet rs = null;    
        int contCampos = 0;
        ArrayList<Filme> filmes = new ArrayList<Filme>();
        try{
            String SQL = " SELECT * FROM filme where codigo = ? ";
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            ps.setInt(1,codigo);
            rs = ps.executeQuery();
            while (rs.next()){
            	return (new Filme(rs.getString("nomeFilme"),rs.getString("nomeFilmeOriginal"),rs.getString("nomeDiretor"),rs.getInt("duracao"),rs.getString("sinopse"),rs.getInt("idadeMinima"),rs.getString("caminhoImagem"),rs.getDate("dataEstreia"),rs.getInt("codigo")));
            }
            return null;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return null;
        }

	}

	public boolean excluirFilme(int codigo){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        try{
            String SQL = " DELETE FROM filme where codigo = ? ";
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            ps.setInt(1,codigo);
            ps.executeUpdate();
            return true;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return false;
        }

	}

	
	
	public boolean atualizarArquivo(Integer codigo,String nomeArquivo){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        int contadorCampos = 0;
        String campos = "";
        try{
            String SQL = " UPDATE Filme set  ";
            
            if (nomeArquivo != null) {
            	campos = campos + "caminhoImagem = ? ";
            }	
            SQL = SQL + campos +" where codigo=?";
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            if (nomeArquivo != null) {
            	ps.setString(1, nomeArquivo);
            }	
            ps.setInt(2, codigo);
            ps.executeUpdate();
            return true;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return false;
        }

		
	}
	
	public boolean atualizarFilme(Filme filme){
		//Salva o filme no banco de dados
		PreparedStatement ps = null;
        Connection connL = null;
        int contadorCampos = 0;
        String campos = "";
        try{
            String SQL = " UPDATE Filme set  ";
            
            if (filme.getNomeDiretor() != null) {
            	campos = campos + "nomeDiretor = ?,";
            }	
            if (filme.getSinopse() != null) {
            	campos = campos + "sinopse = ?,";
            }	
            if (filme.getIdadeMinima() != 0) {
            	campos = campos + "idadeMinima = ?,";
            }	
            if (filme.getCaminhoImagem() != null) {
            	campos = campos + "caminhoImagem = ?,";
            }	
            
            campos = campos + "nomeFilme = ?,nomeFilmeOriginal = ?,duracao = ?,dataEstreia = ? where codigo = ? ";
            SQL = SQL + campos;
            connL = this.conexao;
            ps = connL.prepareStatement(SQL);
            if (filme.getNomeDiretor() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getNomeDiretor());
            }	
            if (filme.getSinopse() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getSinopse());
            }	
            if (filme.getIdadeMinima() != 0) {
            	contadorCampos++;
            	ps.setInt(contadorCampos, filme.getIdadeMinima());
            }	
            if (filme.getCaminhoImagem() != null) {
            	contadorCampos++;
            	ps.setString(contadorCampos, filme.getCaminhoImagem());
            }	
            
            ps.setString(contadorCampos+1,filme.getNomeFilme());
            ps.setString(contadorCampos+2,filme.getNomeFilmeOriginal());
            ps.setInt(contadorCampos+3,filme.getDuracao());
            ps.setDate(contadorCampos+4, filme.getDataEstreia());
            ps.setInt(contadorCampos+5, filme.getCodigo());
            ps.executeUpdate();
            return true;
        }catch(Exception e){
        	System.out.println(e.getLocalizedMessage());
        	return false;
        }
        
	}
        
        public int buscaNumeroPaginasTodos() throws Exception{

            PreparedStatement ps = null;
            Connection connL = null;
            ResultSet rs = null;
            try{
                String SQL = "SELECT Count(*) as totalRegs FROM filme ";
                connL = this.conexao;
                ps = connL.prepareStatement(SQL);
                rs = ps.executeQuery();

                if (!rs.next()){
                  return 0;
                }

                int totalRegs = rs.getInt("totalRegs");
                int numeroPaginas = totalRegs/10;
                if ((numeroPaginas * 10) < totalRegs){
                    numeroPaginas++;
                }
                return numeroPaginas;
            }catch(SQLException sqle){
				System.out.println(sqle.getLocalizedMessage());
            	return 0;
            } 
         }

          public int buscaNumeroPaginasFiltro(String nome,int idade) throws Exception{

              PreparedStatement ps = null;
              Connection connL = null;
              ResultSet rs = null;
              try{
                  int contCampos = 0;
                  String SQL = "SELECT Count(*) as totalRegs FROM filme WHERE 1=1 ";
                  connL = this.conexao;
                  if ((nome != null) && (nome != "")) {
                  	SQL = SQL + " and nomeFilme like ? ";
                  	contCampos++;
                  }
                  if (idade > 0){
                  	SQL = SQL + " and idadeMinima = ? ";
                  }
                  ps = connL.prepareStatement(SQL);
                  if (!nome.trim().equals("")){
                      ps.setString(1, "%" + nome + "%");
                  }
                  if (idade > 0)
                  	ps.setInt(contCampos+2,idade);
                  rs = ps.executeQuery();
                  if (!rs.next()){
                          return 0;
                      }
                      int totalRegs = rs.getInt("totalRegs");
                      int numeroPaginas = totalRegs/10;
                      if ((numeroPaginas * 10) < totalRegs){
                          numeroPaginas++;
                      }
                      return numeroPaginas;
                }catch(SQLException sqle){
                	System.out.println(sqle.getLocalizedMessage());
                	return 0;
                } 
             }
         


	

}
